/*!	 gtkmm/main.cpp
**	 Synfig Studio Entrypoint
**
**	Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley
**	Copyright (c) 2007, 2008 Chris Moore
**
**	This package is free software; you can redistribute it and/or
**	modify it under the terms of the GNU General Public License as
**	published by the Free Software Foundation; either version 2 of
**	the License, or (at your option) any later version.
**
**	This package is distributed in the hope that it will be useful,
**	but WITHOUT ANY WARRANTY; without even the implied warranty of
**	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
**	General Public License for more details.
**
*/

#ifdef USING_PCH
#	include "pch.h"
#else
#ifdef HAVE_CONFIG_H
#	include <config.h>
#endif

#include <synfig/general.h>

#include "app.h"
#include <iostream>
#include "ipc.h"
#include <stdexcept>

#include <gui/localization.h>
#include <glibmm/convert.h>

#ifdef _WIN32
#include "main_win32.h"
#endif

#endif

using namespace std;
using namespace etl;
using namespace synfig;
using namespace studio;

int main(int argc, char **argv)
{

#ifdef _WIN32

    if (consoleOptionEnabled(argc, argv)) {
        redirectIOToConsole();
    } else {
        // QuickHack: to avoid strange bug with stderr
        freopen("NUL", "w", stdout);
        freopen("NUL", "w", stderr);
        freopen("NUL", "r", stdin);
        ios::sync_with_stdio();
    }

#endif

    String binary_path = synfig::get_binary_path(String(argv[0]));

#ifdef ENABLE_NLS
    String locale_dir;
    locale_dir = etl::dirname(etl::dirname(binary_path)) + ETL_DIRECTORY_SEPARATOR + "share" + ETL_DIRECTORY_SEPARATOR + "locale";
    setlocale(LC_ALL, "");
    bindtextdomain(GETTEXT_PACKAGE,  Glib::locale_from_utf8(locale_dir).c_str());
    bind_textdomain_codeset(GETTEXT_PACKAGE, "UTF-8");
    textdomain(GETTEXT_PACKAGE);
#endif
    {
        SmartFILE file(IPC::make_connection());

        if (file) {
            cout << endl;
            cout << "   " << _("synfig studio is already running") << endl << endl;
            cout << "   " << _("the existing process will be used") << endl << endl;;

            // Hey, another copy of us is open!
            // don't bother opening us, just go ahead and
            // tell the other copy to load it all up
            if (argc > 1) {
                fprintf(file.get(), "F\n");
            }

            while (--argc)
                if ((argv)[argc] && (argv)[argc][0] != '-') {
                    fprintf(file.get(), "O %s\n", etl::absolute_path((argv)[argc]).c_str());
                }

            fprintf(file.get(), "F\n");

            return 0;
        }
    }

    cout << endl;
    cout << "   " << _("synfig studio -- starting up application...") << endl << endl;

    try {
        studio::App app(etl::dirname(binary_path), &argc, &argv);

        app.run();
    } catch (int ret) {
        std::cerr << "Application shutdown with errors (" << ret << ')' << std::endl;
        return ret;
    } catch (string str) {
        std::cerr << "Uncaught Exception:string: " << str.c_str() << std::endl;
        throw;
    } catch (std::exception x) {
        std::cerr << "Standard Exception: " << x.what() << std::endl;
        throw;
    } catch (Glib::Exception& x) {
        std::cerr << "GLib Exception: " << x.what() << std::endl;
        throw;
    } catch (...) {
        std::cerr << "Uncaught Exception" << std::endl;
        throw;
    }

    std::cerr << "Application appears to have terminated successfully" << std::endl;

    return 0;
}